package com.sxj.corejava.code06_数组;

import java.util.Arrays;
import java.util.Scanner;

/**
 * @author 石小俊
 * 2024年07月12日 8:35
 * 从键盘输入一个整数,控制生成的二维数组,以顺时针螺旋式的形式填充到二维数组中
 * 例如:输一个数字2,程序输出如下
 * 1	2
 * 4   3
 * 输入数字3,程序输出如下
 * 1	2	3
 * 8   9   4
 * 7   6   5
 * 输入数字4,程序输出如下
 * 1	2	3	4
 * 12	13	14  5
 * 11  16 	15  6
 * 10   9 	8	7
 */
public class Test11_螺旋式数组 {

    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        System.out.print("请输入每一行元素的数量:");
        int num = sc.nextInt();
        int[][] arr = new int[num][num];
        // arr[y][x]
        // 定义数组下标中x轴下标的最小值与最大值
        int minX = 0, maxX = num - 1;
        // 定义数组下标中y轴下标的最小值与最大值
        int minY = 0, maxY = num - 1;
        // 定义数组元素数据的初始值
        int count = 1;
        // 当最小值>最大值的时候,说明数据已经全部处理好了
        while (minX <= maxX) {
            // 从左往右,此时的y轴是没有变化的,变化的只有x轴,此时的y轴下标是最小值
            // x轴的下标从最小到最大
            for (int x = minX; x <= maxX; x++) {
                arr[minY][x] = count++;
            }
            // 此时最上方的元素已经全部赋值了,因此后面不需要再对最上方的元素进行处理
            // 下次再处理时,y轴的最小值需要+1
            minY++;

            // 从上往下,此时x轴下标是最大值,y轴下标从小到大依次赋值
            for (int y = minY; y <= maxY; y++) {
                arr[y][maxX] = count++;
            }
            // 此时最右边的元素已经全部赋值了
            // 因此,下次再处理时,x轴的最大值需要-1
            maxX--;

            // 从右往左,此时x轴的下标是从大到小进行赋值,y轴处于最大值
            for (int x = maxX; x >= minX; x--) {
                arr[maxY][x] = count++;
            }
            // 此时最下方的元素已经全部赋值了,y轴最大值需要-1
            maxY--;

            // 从下往上,此时x轴下标处于最小值,y轴下标是从大到小进行赋值
            for (int y = maxY; y >= minY; y--) {
                arr[y][minX] = count++;
            }
            // 此时最左边的元素已经全部赋值了,x轴最小值需要+1
            minX++;
        }

        for (int i = 0; i < arr.length; i++) {
            for (int j = 0; j < arr[i].length; j++) {
                System.out.print(arr[i][j] + "\t");
            }
            System.out.println();
        }

    }

}
